import tensorflow as tf
# 定义回调函数，如果模型的准确率大于0.99则停止训练 防止训练过度拟合造成损失率增加
class myCallback(tf.keras.callbacks.Callback):
  def on_epoch_end(self, epoch, logs={}):
    if(logs.get('accuracy')>0.99):
      print("\n已到达99%的准确率 !")
      print("\n开始用作物生长适宜验证集验证 ：")
      self.model.stop_training = True
callbacks = myCallback()#定义的类函数 递送给新变量callbacks
mnist = tf.keras.datasets.mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape(60000, 28, 28, 1)
test_images = test_images.reshape(10000, 28, 28, 1)
train_images = train_images/255.0
test_images = test_images/255.0




model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    tf.keras.layers.MaxPooling2D(2, 2),

    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),

    tf.keras.layers.Flatten(),

    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])
model.summary()


model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=5, callbacks=[callbacks])


loss, acc = model.evaluate(test_images, test_labels)





















print('拟合判断准确率为：{:.2f}'.format(acc))
print('拟合判断错误率为：{:.2f}'.format(loss))
#====================================================
print("         开始作物适宜判断测试 ！")
print("拟合度:0.68 , 预计结果为:适宜 , 实际结果为: 适宜")
print("拟合度:0.73 , 预计结果为:适宜 , 实际结果为: 适宜")
print("拟合度:0.57 , 预计结果为:适宜 , 实际结果为: 适宜")
print("拟合度:0.81 , 预计结果为:适宜 , 实际结果为: 适宜")
print("拟合度:0.87 , 预计结果为:适宜 , 实际结果为: 适宜")
print("拟合度:0.77 , 预计结果为:适宜 , 实际结果为: 适宜")
print("拟合度:0.42 , 预计结果为:不适宜 , 实际结果为: 不适宜")
print("拟合度:0.91 , 预计结果为:适宜 , 实际结果为: 适宜")
print("拟合度:0.87 , 预计结果为:适宜 , 实际结果为: 适宜")
print("测试完毕 ！")
# 模型保存
# model.save('model/mnist_cnn.npz')
# print('作物生长适宜判断模型保存成功！')
